/**
 * 文件：GameDAO.java
 * 作者：苏新阳
 * 完成度：进行中
 * 最后修改日期：2023-7-3 19:22
 */
package com.gomokult.dao;
import com.gomokult.entity.Game;
import com.gomokult.exception.InvalidIDException;
import java.sql.Timestamp;
import java.util.List;

public interface GameDAO {
    /**
     * 根据ID查询HistoryGame表，获取Game实体。
     * @param gameID 需要查询的对局的ID字段
     * @return 返回game实体
     * @throws InvalidIDException 当ID无效或不存在时
     */
    Game getGame(int gameID);

    /**
     * service实现类传来game实体，将实体中的内容更新
     * @param game service传来的game实体
     * @throws InvalidIDException 当ID无效或不存在时
     */
    void updateGame(Game game) throws InvalidIDException;

    /**
     * service实现类传来dameDate对局数据提交到数据库的对局数据库中
     * @param gameData service传来的对局数据
     * @return 表示数据库为该对局分配的ID（即主键）
     * @throws InvalidIDException 当数据无效或不存在时
     */
    int insertGame(Game gameData);

    /**
     * 在数据库中查询表，统计所有存在的对局数量，并返回
     * @return 获取数据库中所有对局的数量总和
     */
    int getGamesCount();
    /**
     * 在数据库中查询表，统计所有存在的对局数量，并返回
     * @return 获取数据库中所有对局的数量总和
     */
    int getGamesCount(int userID) throws InvalidIDException;
    /**
     * 在数据库中查询表，统计所有存在的对局数量，并返回
     * @return 获取数据库中所有对局的数量总和
     */
    int getGamesCount(String email,Timestamp startDate, Timestamp endDate) throws InvalidIDException;

    /**
     * 根据用户名userID查询数据库库中符合特定时间段startDate到endDate中，和符合特定数量段中从start开始查找end数量个对局，并返回对局内容
     * @param start 查询数据库中对局的开始的条数
     * @param end 要查询数据库的数据条数
     * @param userID 用于筛选特定用户的对局。如果值为{@code 0}，表示不对对局参与者进行筛选，获取所有用户的对局；否则，该方法只返回用户{@code userID}参与的对局
     * @param startDate 用于筛选特定时间段内的对局，表示时间区间（闭区间）的起点
     * @param endDate 用于筛选特定时间段内的对局，表示时间区间（闭区间）的终点
     * @return 返回查询的对局的所有内容
     * @throws InvalidIDException 当ID无效或不存在时
     */
    List<Game> getGamesFromPageDate(int start, int end, String email, Timestamp startDate, Timestamp endDate);

    /**
     * 根据用户名userID查询数据库库中符合特定数量段中从start开始查找end数量个对局，并返回对局内容
     * @param start 查询数据库中对局的开始的条数
     * @param end 要查询数据库的数据条数
     * @param userID 用于筛选特定用户的对局。如果值为{@code 0}，表示不对对局参与者进行筛选，获取所有用户的对局；否则，该方法只返回用户{@code userID}参与的对局
     * @return 返回查询的对局的所有内容
     * @throws InvalidIDException 当ID无效或不存在时
     */
    List<Game> getGamesFromPage(int start, int end, int userID);
    /**
     * 设置指定对局的评论开放状态
     * @param gameID 对局ID
     * @param commentable 开放状态
     * @throws InvalidIDException 当ID无效或不存在时
     */
    void setCommentable(int gameID, boolean commentable) throws InvalidIDException;

    /**
     * 获取指定对局的评论开放状态
     * @param gameID 对局ID
     * @return 开放状态
     * @throws InvalidIDException 当ID无效或不存在时
     */
    boolean getCommentable(int gameID) throws InvalidIDException;
    /**
     * 删除指定对局
     * @param gameID gameID
     * @throws InvalidIDException 当ID无效或不存在时
     */
    void deleteGame(int gameID) throws InvalidIDException;

}
